package HighConcurrency.JUC;

import java.util.concurrent.*;

public class ExecutorServiceDemo2 {
    public static void main(String[] args) {
        ExecutorService es= Executors.newCachedThreadPool();
        //预定义线程池，没有核心线程，可以无限的创建线程，但是最大线程数是Integer.MAX_VALUE
        //考虑到单台服务器性能问题，我们认为他可以处理无限多的线程
        //临时线程存活时间为60s
        //工作队列是一个同步队列
        //大池子小队列
        //应用于高并发短任务的场景，例如即时聊天

        ExecutorService es2=Executors.newFixedThreadPool(5);
        //线程池大小为5，最大线程数也是5，没有临时线程，工作队列是一个阻塞式链式队列且没有容量
        //默认容量为Integer.MAX_VALUE，一般认为这个队列可以存储无限多的请求
        //小池子大队列
        //适用于并发低，长任务的场景，例如百度下载

        ScheduledExecutorService es3=Executors.newScheduledThreadPool(5);
        //定时调度执行器服务 ，核心线程值为5
        es3.schedule(new ScheduleThread(), 5, TimeUnit.SECONDS);//5秒后执行ScheduleThread()

        es3.scheduleAtFixedRate(new ScheduleThread(), 5, 5, TimeUnit.SECONDS);
        //每5秒执行一次ScheduleThread(), 但是第一次执行需要等待initualDelay5秒
        //在任务执行过程中，如果执行时间超过5秒，那么后续的请求将会被阻塞，直到当前任务执行完
        //即间隔时间为二者最值

        es3.scheduleWithFixedDelay(new ScheduleThread(), 5, 5, TimeUnit.SECONDS);
        //每5秒执行一次ScheduleThread(), 但是第一次执行需要等待initualDelay5秒，每次执行完之后，再等待5秒，
         // 这样就保证了两次执行之间的间隔是5秒

        //scheduleAtFixedRate从上一个任务strate开始
        //scheduleWithFixedDelay从上一个任务end开始

    }
}
class ScheduleThread implements Runnable{
    @Override
    public void run(){
        System.out.println("thread run");
    }
}
